package com.iob.coin.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Set;

/**
 * @Author: GuoXinyuan
 * @Date: 2021/6/6
 * RDFS主要含有以下几种类型的资源：
 *  Class：类型（不能作为三元组的谓语）
 *  Resource：资源（不能作为三元组的谓语）
 *  Property：属性
 *  Literal：文字（不能作为三元组的 主语 和 谓语）
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Answer {

    /**
     * 回答的类型 根据此项来判断 Answer.content具体形式
     */
    private AnswerType type;

    /**
     * 回答具体内容
     */
    private Object content;

    /**
     * 回答具体类型
     */
    private enum AnswerType {
        /**
         * 其他Answer的List，content为 List<Answer>类型
         */
        ANSWER_LIST,

        /**
         * 有关某个 Resource的所有信息，content为 ResourceContent类型
         */
        RESOURCE,

        /**
         * 有关某个 Class的所有信息，content为 ResourceContent类型
         * 与 RESOURCE类型content形式一致
         *  - CLASS中 ResourceContent的 ResourceContent.kg包含与 ResourceContent.resource(一定是一种类型)相关的所有三元组
         *  - RESOURCE中 content的 ResourceContent.kg在包含与 ResourceContent.resource(一定是一种资源)相关之外
         *    还包含 ResourceContent.resource的类型 Class相关的所有三元组
         */
        CLASS,

        /**
         * 多层问题的信息， content为MultipleContent类型
         */
        MULTIPLE,
    }

    public void setAnswerListContent(List<Answer> answerList){
        this.type = AnswerType.ANSWER_LIST;
        this.content = answerList;
    }

    public void setResourceContent(Node resource, Set<String> recommends,KG kg) {
        this.type = AnswerType.RESOURCE;
        this.content = new ResourceContent(resource,kg,recommends);
    }

    public void setClassContent(Node resource, Set<String> recommends,KG kg){
        this.type = AnswerType.CLASS;
        this.content = new ResourceContent(resource,kg,recommends);
    }

    public void setMultipleContent(List<MultipleContent.Item> list, Set<String> recommends, KG kg){
        this.type = AnswerType.MULTIPLE;
        this.content = new MultipleContent(list,kg,recommends);
    }

}